#ifndef __ITERATOR_REGISTER_DOT_H__
#define __ITERATOR_REGISTER_DOT_H__
#include <Types.h>
#include <DagMtx.h>
#include <DedupMem.h>
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template < typename node_t, typename T > class IteratorRegister {

private:
   
   const bool nopc;

   // -- TODO -- make const:
   node_t zeroNode;
   
   U64 currLeafPos;
   U64 currNodePos;
   U64 pathLowerBound;
   U64 pathUpperBound;
   U32 lvl;
   U32 hgt;
   U32 root;
   
   const U32 deg;
   const U32 ptrsSize;
   const U32 leafSize;
   const U32 nodeSize;
   
   const U32 numLeafPerNode;
   const U32 numPtrsPerLeaf;
   const U32 leafPosMask;
   const U64 nsa;
   const U32 psa;
   const U32 pmin;
   
   U32    sp;
   
   U32    vpath    [ 60 ];
   node_t oldNodes [ 60 ];
   node_t newNodes [ 60 ];
   
   U32 nnz;   
   std::map< T, U32 > unzMap;
   DedupMem< node_t > & ddm;
   
   void PopLevel( void );
   void PushLevel ( const U64 nodePos );
   void CommitPath( void );
   inline const bool PathContainsNodePos( const U64 nodePos ) const {
      
      if( nodePos < pathUpperBound ) {
         if( nodePos >= pathLowerBound ) {
            return true;
         }
      }
      return false;
   }
   
public:
   
   IteratorRegister( const U32 _deg, const bool pcEnable, DedupMem< node_t > & _ddm );
   inline const U32 Hgt( void ) const { return hgt; }
   void Audit( void ) const;
   void Commit( DagMtx< node_t > & dagmtx );
   void SetLeafPos( const U64 reqdLeafPos );
   void SetLeafVal( const double v );
   void SetLeafVal( const S32    v );
   inline const U32 Root( void ) const { return root; }
};
#endif
